//: Playground - noun: a place where people can play

import UIKit

class Person {
    var name : String = ""
    var dog : Dog?

}

class Dog {
    var name : String = ""
    var toy : Toy?
}

class Toy {
    var name : String = ""
    var price : Double = 0.0

    func flying() {
        print("toy is flying !")
    }
}

let p = Person()
p.name = "Alex"
let d = Dog()
let t = Toy()

p.dog = d
d.toy = t

// 一. 取出Alex的狗的玩具的价格

// 这种取法非常危险
let dog = p.dog
let toy = dog!.toy
let price = toy!.price

// 可选绑定的方式取值, 非常麻烦
if let dog = p.dog {
    if let toy = dog.toy {
        let price = toy.price
    }
}


// 可选链的方式取值, 比较简单
// ?.就是可选链, 系统会自动判断该可选类型是都有值
// 如果有值, 则解包, 没有值则赋值为nil
// 可选链获取的值是一定是一个可选类型
if let p = p.dog?.toy?.price {
    print(price)
}

// 二. 给Alex的狗的玩具赋值一个新的Price
p.dog?.toy?.price = 20
t


// 三. 可选链调用方法
p.dog?.toy?.flying()
